# pip install scrapy



# 【一】查看项目指令
# django-admin
"""
[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations # 生成迁移记录
    migrate   # 生成数据库表
    runserver # 启动Django项目
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp # 创建 app
    startproject # 创建Django项目
    test
    testserver
"""

# scrapy
'''
Usage:
  scrapy &lt;command&gt; [options] [args]

Available commands:
  bench         Run quick benchmark test
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates # 创建一个爬虫程序用指定的模版
  runspider     Run a self-contained spider (without creating a project) # 启动一个自己创建的项目
  settings      Get settings values # 获取到配置项
  shell         Interactive scraping console
  startproject  Create new project # 创建新项目
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy &lt;command&gt; -h" to see more info about a command
'''

# scrapy startproject -h
'''
Create new project

Global Options
--------------
  --logfile FILE        log file. if omitted stderr will be used
  -L LEVEL, --loglevel LEVEL
                        log level (default: DEBUG)
  --nolog               disable logging completely
  --profile FILE        write python cProfile stats to FILE
  --pidfile FILE        write process ID to FILE
  -s NAME=VALUE, --set NAME=VALUE
                        set/override setting (may be repeated)
  --pdb                 enable pdb on failure
'''

# 【二】创建项目
# scrapy startproject 项目名称
# scrapy startproject SpiderScrapy
'''
New Scrapy project 'SpiderScrapy', using template directory '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/scrapy/templates/project', created in:
    /Users/dream/Documents/PythonProjects/Python30/Day67_Spider/day06_Scrapy/SpiderScrapy

You can start your first spider with:
    cd SpiderScrapy
    scrapy genspider example example.com
'''

# 【三】进入项目
# cd SpiderScrapy

# 【三】创建你的爬虫程序
# scrapy genspider example example.com
# scrapy genspider 爬虫程序的名字 爬虫目标的域名
# scrapy genspider baidu www.baidu.com
# scrapy genspider sougou www.sougou.com
'''
Created spider 'baidu' using template 'basic' in module:
  SpiderScrapy.spiders.baidu
'''

# 【四】创建的爬虫程序解释
'''
# 导入 scrapy 模块
import scrapy


# 自动帮助我们创建的一个爬类 继承了 默认的 Spider 类
# 类似于我们Django项目中的 View  django.views.View
# Django是一个后台服务 
class SougouSpider(scrapy.Spider):
    # 指当前爬虫的名称 跟你创建项目时候有关 跟你的当前爬虫文件名是一致的
    name = "sougou"
    # 允许访问的当前域名 在我们实现多页爬取的时候如果下一页的域名和当前的域名不一致 爬虫就不会生效了
    allowed_domains = ["www.sougou.com"]
    # 起始的 URL 爬虫启动后第一次访问的目标地址
    start_urls = ["https://www.sougou.com"]
    
    # 我们处理响应的地方
    def parse(self, response):
        # response 当前 scrapy 帮助我们发起请求 获取到的响应内容 scrapy 内置的响应对象 可以直接使用 xpath .. 
        # response = requests.get("https://www.sougou.com")
        pass
'''
# 【五】scrapy项目文件解释
'''
SpiderScrapy
├── __init__.py # 初始化文件
├── items.py # 管道 类似与Django项目中的 models 模型表 我们需要再里面创建模型类
├── middlewares.py # 中间件 和 Django的 中间件 是一样的 拦截我们的请求和响应
├── pipelines.py # 管道 在这里负责对数据进行清洗和存储
├── settings.py # 项目的配置文件
└── spiders # 存储你的爬虫程序的文件夹
    ├── baidu.py # 你自己需要对响应进行处理的爬虫逻辑
'''

# 【六】启动爬虫程序
# scrapy crawl 爬虫文件名
# scrapy crawl baidu
# robots.txt 机器人协议(爬虫协议):君子协议  大家都会被爬虫光顾，于是我们统一规定 用 robots.txt 来声明自己的网站内哪些内容是允许爬的
'''
2024-11-05 09:27:07 [scrapy.core.engine] DEBUG: Crawled (200) &lt;GET https://www.baidu.com/robots.txt&gt; (referer: None)
2024-11-05 09:27:07 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: &lt;GET https://www.baidu.com&gt;
'''
# 所以一般情况下 大家都不遵循 Forbidden by robots.txt: &lt;GET https://www.baidu.com&gt;

# 不遵守
# 修改 settings.py 中的配置
# ROBOTSTXT_OBEY = False
'''
import scrapy


class BaiduSpider(scrapy.Spider):
    name = "baidu"
    allowed_domains = ["www.baidu.com"]
    start_urls = ["https://www.baidu.com"]

    def parse(self, response):
        print(f"response :&gt;&gt;&gt;&gt; {response.text}")
        pass
'''
# 获取到响应源码

# 【七】不带日志启动项目
# 【1】方式一：命令行
# 在输出源码的时候都会带很多日志信息
# scrapy crawl baidu --nolog

# 【2】方式二：修改配置文件的日志等级
# 添加一个日志等级
# LOG_LEVEL = "ERROR"
# 去除 ERROR 等级以外的其他日志

# 【八】还可以文件启动项目
# 创建一个 py 文件
'''
from scrapy.cmdline import execute

# scrapy crawl baidu
# execute(["scrapy", "crawl", "baidu"])
# 无日志启动
execute(["scrapy", "crawl", "baidu","--nolog"])
'''
